home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1997 December
/
MACPOWER-1997-12.ISO.7z
/
MACPOWER-1997-12.ISO
/
AMUG
/
PROGRAMMING
/
Raven 1.2 Examples.sit
/
Raven 1.2 Examples
/
Quill
/
Source
/
ViewTrackers.cpp
< prev
next >
Wrap
Text File
|
1997-05-03
|
7KB
|
261 lines
/*
* File: ViewTrackers.cpp
* Summary: Tracker classes used by CViewContainer.
* Written by: Jesse Jones
*
* Copyright ゥ 1996-1997 Jesse Jones.
* For conditions of distribution and use, see copyright notice in ZTypes.h
*
* Change History (most recent first):
*
* <3> 5/02/97 JDJ OnTrackStop now only has a stopPt argument.
* <2> 4/06/97 JDJ Updated for new style TSubPaneIterator.
* <1> 10/13/96 JDJ Created
*/
#include "ViewTrackers.h"
#include <ZAttribute.h>
#include <ZQDShapes.h>
#include <ZView.h>
#include <ZWindow.h>
#include "ViewCommands.h"
#include "ViewContainer.h"
// ===================================================================================
// class TSelectPanesTracker
// ===================================================================================
//---------------------------------------------------------------
//
// TSelectPanesTracker::~TSelectPanesTracker
//
//---------------------------------------------------------------
TSelectPanesTracker::~TSelectPanesTracker()
{
}
//---------------------------------------------------------------
//
// TSelectPanesTracker::TSelectPanesTracker
//
//---------------------------------------------------------------
TSelectPanesTracker::TSelectPanesTracker(CViewContainer* container, const TPoint& startPt, bool extend) : TRubberBandTracker(container, startPt)
{
mContainer = container;
mExtend = extend;
}
//---------------------------------------------------------------
//
// TSelectPanesTracker::OnTrackStart
//
//---------------------------------------------------------------
void TSelectPanesTracker::OnTrackStart(const TPoint& startPt)
{
Inherited::OnTrackStart(startPt);
if (mExtend) {
TSubPaneIterator iter = mContainer->begin(kRecursive);
while (iter != mContainer->end()) {
TPane* pane = *iter;
++iter;
if (mContainer->IsSelected(pane))
pane->AddAttribute("Was Selected", new TAttribute);
}
} else
mContainer->Select(nil);
}
//---------------------------------------------------------------
//
// TSelectPanesTracker::OnTrackContinue
//
//---------------------------------------------------------------
TTracker* TSelectPanesTracker::OnTrackContinue(const TPoint& anchorPt, const TPoint& prevPt, const TPoint& nextPt, bool mouseMoved)
{
TTracker* tracker = Inherited::OnTrackContinue(anchorPt, prevPt, nextPt, mouseMoved);
if (mSelection.GetWidth() >= mMinSize.width && mSelection.GetHeight() >= mMinSize.height) {
TRect box = mContainer->LocalToPort(mSelection);
TSubPaneIterator iter = mContainer->begin(kRecursive);
while (iter != mContainer->end()) {
TPane* pane = *iter;
++iter;
TRect bounds = pane->GetExtent();
bounds = pane->LocalToPort(bounds);
if (bounds.Intersects(box) && !bounds.Contains(box)) {
if (!mContainer->IsSelected(pane))
mContainer->Select(pane, true);
} else {
if (mContainer->IsSelected(pane) && !pane->HasAttribute("Was Selected"))
mContainer->DoDeselect(pane);
}
}
}
return tracker;
}
//---------------------------------------------------------------
//
// TSelectPanesTracker::OnTrackStop
//
//---------------------------------------------------------------
void TSelectPanesTracker::OnTrackStop(const TPoint& stopPt)
{
if (mExtend) {
TSubPaneIterator iter = mContainer->begin(kRecursive);
while (iter != mContainer->end()) {
TPane* pane = *iter;
++iter;
if (pane->HasAttribute("Was Selected"))
pane->RemoveAttribute("Was Selected");
}
}
Inherited::OnTrackStop(stopPt);
}
#pragma mark -
// ===================================================================================
// class CResizeTracker
// ===================================================================================
//---------------------------------------------------------------
//
// CResizeTracker::~CResizeTracker
//
//---------------------------------------------------------------
CResizeTracker::~CResizeTracker()
{
}
//---------------------------------------------------------------
//
// CResizeTracker::CResizeTracker
//
//---------------------------------------------------------------
CResizeTracker::CResizeTracker(TPane* pane, const TPoint& anchor, const TPoint& startPt) : TTracker(pane->GetSuperView(), pane->LocalToSuper(startPt))
{
ASSERT(pane != nil);
mSubPane = pane;
mContainer = dynamic_cast<CViewContainer*>(mSubPane->GetTopView()->FindSubPane("CViewContainer"));
mAnchor = mSubPane->LocalToSuper(anchor);
}
//---------------------------------------------------------------
//
// CResizeTracker::OnTrackStart
//
//---------------------------------------------------------------
void CResizeTracker::OnTrackStart(const TPoint& startPt)
{
#pragma unused(startPt)
mOldFrame = mSubPane->GetFrame();
}
//---------------------------------------------------------------
//
// CResizeTracker::OnTrackConstrain
//
//---------------------------------------------------------------
void CResizeTracker::OnTrackConstrain(const TPoint& anchorPt, const TPoint& prevPt, TPoint& nextPt)
{
#pragma unused(anchorPt, prevPt)
if (mContainer != nil && mContainer->SnapToGrid()) {
TSize gridSize = mContainer->GetGrid();
TPoint constrain = nextPt;
constrain = mPane->LocalToPort(constrain);
constrain = mContainer->PortToLocal(constrain);
TPoint constrained;
constrained.h = ((constrain.h + gridSize.width/2)/gridSize.width)*gridSize.width;
constrained.v = ((constrain.v + gridSize.height/2)/gridSize.height)*gridSize.height;
nextPt = constrained;
nextPt = mContainer->LocalToPort(nextPt);
nextPt = mPane->PortToLocal(nextPt);
}
}
//---------------------------------------------------------------
//
// CResizeTracker::OnTrackContinue
//
//---------------------------------------------------------------
TTracker* CResizeTracker::OnTrackContinue(const TPoint& anchorPt, const TPoint& prevPt, const TPoint& nextPt, bool mouseMoved)
{
#pragma unused(anchorPt, prevPt, mouseMoved)
TRect frame;
if (nextPt.h >= mAnchor.h) {
frame.left = mAnchor.h;
frame.right = nextPt.h;
} else {
frame.left = nextPt.h;
frame.right = mAnchor.h;
}
if (nextPt.v >= mAnchor.v) {
frame.top = mAnchor.v;
frame.bottom = nextPt.v;
} else {
frame.top = nextPt.v;
frame.bottom = mAnchor.v;
}
if (frame != mSubPane->GetFrame()) {
mSubPane->SetFrame(frame);
mSubPane->HandleUpdate();
}
return this;
}
//---------------------------------------------------------------
//
// CResizeTracker::OnTrackStop
//
//---------------------------------------------------------------
void CResizeTracker::OnTrackStop(const TPoint& stopPt)
{
#pragma unused(stopPt)
TRect newFrame = mSubPane->GetFrame();
if (newFrame != mOldFrame) {
TCommand* command = new CResizePaneCommand(mSubPane, mOldFrame, newFrame);
command->Post();
}
}